Programmet til Signaler via NeoPixel i Arduino





#include <Adafruit_NeoPixel.h>

// Arduino program til at sætte lys i LEDs på kontroltavle ved hjælp af I2C og NeoPixels.
// Programmeret af Bo Holmqvist, fra modeljernbaneklubben "Jernhesten".

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

// Hvilket ben på Arduino er tilsluttet NeoPixels LEDs?
// SpSk-S = 1
#define PIN1 2     // 2
// SpSk-N = 2
#define PIN2 3
// Sign-S = 3
#define PIN3 4    // 4
// Sign-N = 4
#define PIN4 5

// Hvor mange RGB Leds er tilsluttet Arduino?  (Ikke individuelle LEDs, som vi egentligt bruger
// Der er tre individuelle LEDs per RGB LED (RGB = Red-Green-Blue)
// Der går to LEDs til et sporskifte. Signaler har større variation. Til tavlen dog kun rød/grøn og ranger.
  // Udlæs til rigtig port. SpSk er 1 og 2. Signaler er 3 og 4
  // 1 = Syd, SpSk         SpSk fra 1 til 50
  // 2 = Nord, SpSk        SpSk fra 51 til 150
  // 3 = Syd, Signaler     Signalnr fra 1 til 100
  // 4 = Nord, Signaler    Signalnr fra 101 til 200
// SpSk-S = 1
#define NUMPIXELS1 30     // 30   3 x 30 = 90
// SpSk-N = 2
#define NUMPIXELS2 48     // 48   3 x 48 = 144
// Sign-S = 3
#define NUMPIXELS3 33     // 36   3 x 33 = 99        max 38 31
// Sign-N = 4
#define NUMPIXELS4 53     // 53    3 x 53 = 159
//                                         500

// Assign NeoPíxels
// SpSk-S = 1
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS1, PIN1, NEO_GRB + NEO_KHZ800);
// SpSk-S = 2
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS2, PIN2, NEO_GRB + NEO_KHZ800);
// SpSk-S = 3
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(NUMPIXELS3, PIN3, NEO_GRB + NEO_KHZ800);
// SpSk-S = 4
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(NUMPIXELS4, PIN4, NEO_GRB + NEO_KHZ800);



// I2C adresse
#define SLAVE_ADDRESS 0x12

// Angiv, hvor kraftigt LEDerne skal lyse - en for hver farve.
// Dette er flyttet til hovedprogrammet, Kastdorf.pas.
#define Lysstyrke_R 120;
#define Lysstyrke_Gr 80;
#define Lysstyrke_Gul 100;
#define Lystyrke_Hv 80;

void setup() {

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

  // Dette initialiserer NeoPixel library.
  pixels1.begin();
  pixels2.begin();
  pixels3.begin();
  pixels4.begin();


  pinMode(13, OUTPUT);
  Serial.begin(115200);  // start serial for output

  // Initialiserer i2c som slave
  Wire.begin(SLAVE_ADDRESS);

  // Definerer callbacks for i2c kommunication
  Wire.onReceive(receiveData);

  Serial.println("Ready!");

}


void loop() {
}


// re-add when working raspberry pi code
// callback for received data
void receiveData(int byteCount) {
  byte x = 0;
  byte i = 1;
  byte R[5] = { 0, 0, 0, 0, 0 };
  byte UdTil = 0;
  byte Nummer = 0;
  byte LED1 = 0;
  byte LED2 = 0;
  byte LED3 = 0;
  byte LED4 = 0;
  byte Stilling = 0;
  byte SignalType = 0;

  Serial.println();
  Serial.print("data received: ");
  //               Serial.print(R[i]);
  while (Wire.available()) {
    R[i] = Wire.read();
    Serial.print(i);
    Serial.print(": ");
    //               Serial.print("data received: ");
    Serial.print(R[i]);
    Serial.print("  ");
    i++;
  }
  Serial.println();

  // Input: 1: SpSk eller Signal,             2: Nummer,   3: Stilling                                    4: SignalType
  //           R[1]                              R[2]         R[3]                                           R[4]
  //           SpSk N/S: 1 , Signal N/S: 2       Nummer       2=ligeud, 1=afvig, 0=slukket, 3=Alle tændt     2 lamper, 4 lamper

  UdTil = R[1];
  Nummer = R[2];
  x = R[2];
  Stilling = R[3];
  SignalType = R[4];

  byte Udgang = 0;


  if (R[1] == 1) {
    if ((x >= 1) && (x <= 50)) { Udgang = 1; }  // Case 1, Udgang
    if ((x >= 51) && (x <= 150)) {
      Udgang = 2;
      x = x - 50;
    }  // Case 2, Udgang
  }

  if (R[1] == 2) {
    if (((x >= 1) && (x <= 50))) { Udgang = 3; }  // Case 3, Udgang
    if (((x >= 51) && (x <= 150))) {
      Udgang = 4;
      x = x - 50;
    }  // Case 4, Udgang
  }

  byte RGBLED = ((int)(((2 * x - 1) - 1) / 3));
  byte RGB1 = ((((2 * x) - 1) - 1) % 3) + 1;
  byte RGB2 = (((2 * x) - 1) % 3) + 1;



  // Til at læse fra LED. x er lig LED nummer startende med nul som den første LED
// Til SpSk
  byte SpSk_LEDS_current_1_1 = (pixels1.getPixelColor(RGBLED) >> 8)  & 0xff;  // Red
  byte SpSk_LEDS_current_1_2 = (pixels1.getPixelColor(RGBLED) >> 16) & 0xff;  // Green
  byte SpSk_LEDS_current_1_3 = (pixels1.getPixelColor(RGBLED))       & 0xff;  // Blue

  byte SpSk_LEDS_post_1_1 =    (pixels1.getPixelColor(RGBLED + 1) >> 8)  & 0xff;  // Red
  byte SpSk_LEDS_post_1_2 =    (pixels1.getPixelColor(RGBLED + 1) >> 16) & 0xff;  // Green
  byte SpSk_LEDS_post_1_3 =    (pixels1.getPixelColor(RGBLED + 1))       & 0xff;  // Blue


  byte SpSk_LEDS_current_2_1 = (pixels2.getPixelColor(RGBLED) >> 8)  & 0xff;  // Red
  byte SpSk_LEDS_current_2_2 = (pixels2.getPixelColor(RGBLED) >> 16) & 0xff;  // Green
  byte SpSk_LEDS_current_2_3 = (pixels2.getPixelColor(RGBLED))       & 0xff;  // Blue

  byte SpSk_LEDS_post_2_1 =    (pixels2.getPixelColor(RGBLED + 1) >> 8)  & 0xff;  // Red
  byte SpSk_LEDS_post_2_2 =    (pixels2.getPixelColor(RGBLED + 1) >> 16) & 0xff;  // Green
  byte SpSk_LEDS_post_2_3 =    (pixels2.getPixelColor(RGBLED + 1))       & 0xff;  // Blue
 

// til Signaler
  byte Signal_LEDS_current_1_1 = (pixels3.getPixelColor(RGBLED) >> 8)  & 0xff;  // Red
  byte Signal_LEDS_current_1_2 = (pixels3.getPixelColor(RGBLED) >> 16) & 0xff;  // Green
  byte Signal_LEDS_current_1_3 = (pixels3.getPixelColor(RGBLED))       & 0xff;  // Blue

  byte Signal_LEDS_post_1_1 =    (pixels3.getPixelColor(RGBLED + 1) >> 8)  & 0xff;  // Red
  byte Signal_LEDS_post_1_2 =    (pixels3.getPixelColor(RGBLED + 1) >> 16) & 0xff;  // Green
  byte Signal_LEDS_post_1_3 =    (pixels3.getPixelColor(RGBLED + 1))       & 0xff;  // Blue

//  byte Signal_LEDS_current_2_1 = (pixels4.getPixelColor(RGBLED) >> 8)  & 0xff;  // Red
//  byte Signal_LEDS_current_2_2 = (pixels4.getPixelColor(RGBLED) >> 16) & 0xff;  // Green
//  byte Signal_LEDS_current_2_3 = (pixels4.getPixelColor(RGBLED))       & 0xff;  // Blue

//  byte Signal_LEDS_post_2_1 =    (pixels4.getPixelColor(RGBLED + 1) >> 8)  & 0xff;  // Red
//  byte Signal_LEDS_post_2_2 =    (pixels4.getPixelColor(RGBLED + 1) >> 16) & 0xff;  // Green
//  byte Signal_LEDS_post_2_3 =    (pixels4.getPixelColor(RGBLED + 1))       & 0xff;  // Blue


  if (R[1] == 1) {
  // 1=closed(green), 0=thrown(red)
     switch (Stilling) {
       case 0:                     // Intet lys
         LED1 = 0;
         LED2 = 0;
        break;
       case 1:                     // Ligeud
         LED1 = Lysstyrke_Gul;
         LED2 = 0;
         break;
       case 2:                     // Afvig
         LED1 = 0;
         LED2 = Lysstyrke_Gul;
         break;
       case 3:                     // Div, test
         LED1 = Lysstyrke_Gul;
         LED2 = Lysstyrke_Gul;
        break;
    }


  }

  if (R[1] == 2) {
     switch (Stilling) {
       case 0:                     // Rødt signal
         LED1 = Lysstyrke_R;
         LED2 = 0;
         LED3 = 0;
         LED4 = 0;
        break;
       case 1:                     // Grønt signal
         LED1 = 0;
         LED2 = Lysstyrke_Gr;
         LED3 = 0;
         LED4 = 0;
         break;
       case 2:                     // Rangering tilladt
         LED1 = 0;
         LED2 = 0;
         LED3 = Lystyrke_Hv;
         LED4 = 0;
         break;
       case 3:                     // Ekstra
         LED1 = 0;
         LED2 = 0;
         LED3 = Lystyrke_Hv;
         LED4 = Lystyrke_Hv;
        break;
    }

  }

  switch (Udgang) {

// SpSk-S begynd
    case 1:

      switch (RGB1) {
        case 1:
          pixels1.setPixelColor(RGBLED, LED2, LED1, SpSk_LEDS_current_1_3);
          break;

        case 2:
          pixels1.setPixelColor(RGBLED, LED1, SpSk_LEDS_current_1_1, LED2);
          break;

        case 3:
          pixels1.setPixelColor(RGBLED, SpSk_LEDS_current_1_2, SpSk_LEDS_current_1_1, LED1);
          pixels1.setPixelColor(RGBLED + 1, SpSk_LEDS_post_1_2, LED2, SpSk_LEDS_post_1_3);
          break;
      }
      pixels1.show();
      break;
// SpSk-S slut

// SpSk-N begynd
    case 2:

      switch (RGB1) {
        case 1:
          pixels2.setPixelColor(RGBLED, LED2, LED1, SpSk_LEDS_current_2_3);
          break;

        case 2:
          pixels2.setPixelColor(RGBLED, LED1, SpSk_LEDS_current_2_1, LED2);
          break;

        case 3:
          pixels2.setPixelColor(RGBLED, SpSk_LEDS_current_2_2, SpSk_LEDS_current_2_1, LED1);
          pixels2.setPixelColor(RGBLED + 1, SpSk_LEDS_post_2_2, LED2, SpSk_LEDS_post_2_3);
          break;
      }
      pixels2.show();
      break;
// SpSk-N slut


// Signal-S
    case 3:

      switch (RGB1) {             //SignalType2 = 2 / SignalType4 = 4
        case 1:
          // SignalType = 2
          if (SignalType == 2) {
          pixels3.setPixelColor(RGBLED, LED2, LED1, Signal_LEDS_current_1_3);
          }

          // SignalType = 4
          if (SignalType == 4) {
          pixels3.setPixelColor(RGBLED, LED2, LED1, LED3);
          pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, LED4, Signal_LEDS_current_1_3);
          }

          break;

        case 2:
          // SignalType = 2
          if (SignalType == 2) {
          pixels3.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
          }
          
          // SignalType = 4
          if (SignalType == 4) {
          pixels3.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
          pixels3.setPixelColor(RGBLED, LED4, LED3,  Signal_LEDS_post_1_3);
          }

          break;

        case 3:
          // SignalType = 2
          if (SignalType == 2) {
          pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
          pixels3.setPixelColor(RGBLED + 1, Signal_LEDS_post_1_2, LED2, Signal_LEDS_post_1_3);
          }
          // SignalType = 4
          if (SignalType == 4) {
          pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
          pixels3.setPixelColor(RGBLED + 1, LED3, LED2, LED4);
          }
          break;
      }
      pixels3.show();
      break;
// Signal-S

// Signal-N
    case 4:

      switch (RGB1) {             //SignalType2 = 2 / SignalType4 = 4
        case 1:
          // SignalType = 2
          if (SignalType == 2) {
          pixels4.setPixelColor(RGBLED, LED2, LED1, Signal_LEDS_current_1_3);
         }

          // SignalType = 4
          if (SignalType == 4) {
          pixels4.setPixelColor(RGBLED, LED2, LED1, LED3);
          pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, LED4, Signal_LEDS_current_1_3);
          }

          break;

        case 2:
          // SignalType = 2
          if (SignalType == 2) {
          pixels4.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
          }
          
          // SignalType = 4
          if (SignalType == 4) {
          pixels4.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
          pixels4.setPixelColor(RGBLED, LED4, LED3,  Signal_LEDS_post_1_3);
          }

          break;

        case 3:
          // SignalType = 2
          if (SignalType == 2) {
          pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
          pixels4.setPixelColor(RGBLED + 1, Signal_LEDS_post_1_2, LED2, Signal_LEDS_post_1_3);
          }
          // SignalType = 4
          if (SignalType == 4) {
          pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
          pixels4.setPixelColor(RGBLED + 1, LED3, LED2, LED4);
          }
          break;
      }
      pixels4.show();
      break;
// Signal-N
  }

}